package thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * Creared with IntelliJ IDEA.
 * Description:callable接口
 * User:yxd
 * Date:2022-04-01
 * Time:23:33
 */
public class Demo28 {
    public static void main(String[] args) {
        Callable<Integer> callable = new Callable<Integer>() {//使用callable来描述一个任务,方便返回值
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i <= 1000; i++) {
                    sum += i;
                }
                return sum;//这就可以返回值了
            }
        };
        //为了让线程执行callable里面的任务,使用构造方法还不行,还需要一个辅助的类
        FutureTask<Integer> task = new FutureTask<>(callable);
        //这就相当于是小票单号一样,因为任务可能不止一个,因此需要这样的"小票"来对应相关的任务,然后凭借这样的"小票"就可以取出任务,对上号,然后可以返回结果
        //创建线程来完成这里的计算任务
        Thread t = new Thread(task);//Thread并没有一个构造方法直接传入callable,因此需要上面的辅助类
        t.start();
        //如果线程没有执行结束,get就会阻塞,一直阻塞到任务完成了结果算出来,才会得到结果
        try {
            System.out.println(task.get());//凭小票得到结果
        } catch (InterruptedException e) {//阻塞过程被打断的异常
            e.printStackTrace();
        } catch (ExecutionException e) {//任务执行过程中出异常
            e.printStackTrace();
        }
    }
}
